#include "u_Oled.h"
#include "Menu.h"
#include "u_Key.h"
#include "Modbus_Master.h"
#include "User_App.h"
#include "u_Beep.h"
#include "./flash/flash_eeprom.h"


void Setting_menu_Style(void);
void Setting_menu_Speed(void);
void MenuVI_Heat_Click_Event(void);
void MenuVII_Heat_ESC_Event(void);
void WaterSetValue(void);
void WaterSetHeatTim(void);

// void MenuVII_WaterSet_Enter(void);
// void Desktop_Esc(void);
// void MenuVII_SetUp_Enter(void);
// void Info_Enter(void);
void MenuVII_Debug_Heat_Ctrl(void);
void MenuVII_Debug_Valve_Ctrl(void);
void MenuVII_Kettle_State(void);
void MenuVII_Spill_State(void);
void MenuVII_Energy(void);

extern bsp_TIM_t Ti_GET_CO; // 定时获取 执行板 数据
extern Menu_t MenuVI_Chief[];
extern Menu_t MenuVII_Heat[];
extern Menu_t MenuVII_Debug[];
extern Menu_t MenuVII_SetUp[];
extern Menu_t MenuVII_Info[];

#if 0
void NULL_Fun(Menu_tt *obj)
{
}
Menu_tt MenuVII_My[] = {
    {"<<<", NULL},
    {"设置水量[100]", NULL}, //
    {"零水量校准", NULL},    //
    {"满水量校准", NULL},    //
    {".."},
};
Menu_tt Menu_My[] = {
    {"<<<", NULL},
    {"时间", NULL},
    {"水量", MenuVII_My},
    {"调试", NULL},
    {"设置", NULL},
    {"信息", NULL},
    {".."},
};
#endif

// 主菜单
Menu_t MenuVI_Chief[] = {
    {"<<<", NULL, NULL},
    {"加热", MenuVI_Heat_Click_Event, MenuVII_Heat},
    {"调试", NULL, MenuVII_Debug},
    {"设置", NULL, MenuVII_SetUp},
    {"信息", NULL, MenuVII_Info},
    {".."},
};
// 二级菜单_加热设置
Menu_t MenuVII_Heat[] = {
    {"<<<", MenuVII_Heat_ESC_Event, MenuVI_Chief},
    {"时间:", WaterSetHeatTim},
    {"水量:", WaterSetValue},
    {".."},
};
// 二级菜单_调试
Menu_t MenuVII_Debug[] = {
    {"<<<", NULL, MenuVI_Chief},
    {"加热[关]", MenuVII_Debug_Heat_Ctrl},
    {"阀门[关]", MenuVII_Debug_Valve_Ctrl},
    {"水壶:", MenuVII_Kettle_State},
    {"水溢:", MenuVII_Spill_State},
    {"电量:", MenuVII_Energy},
    {".."},
};
// 二级菜单_设置
Menu_t MenuVII_SetUp[] = {
    {"<<<", NULL, MenuVI_Chief},
    {"光标风格[反相]", Setting_menu_Style},
    {"动画速度[快]", Setting_menu_Speed},
    {".."},
};
// 二级菜单_信息
Menu_t MenuVII_Info[] = {
    {"<<<", NULL, MenuVI_Chief},
    {VERSION_NUMBER, NULL},
    {".."},
};


// 主要界面
void Chief_Frame_UI(void)
{
    Battery_mV();

    if (info.m_OnlineFlag == 1) // 显示在线状态
    {
        OLED_ShowImage(0, 0, 24, 16, ICON_Link_24x16); // 连接图标
    }
    else
    {
        OLED_ShowImage(0, 0, 24, 16, ICON_NO_Link_24x16); // 不连接图标
    }

#if 0
    // 时间显示
    OLED_ShowNum(42, 5, 18, 2, OLED_6X8);          // 时
    OLED_ShowChar(42 + 16 - 4, 5, ':', OLED_6X8);  //
    OLED_ShowNum(42 + 16, 5, 30, 2, OLED_6X8);     // 分
    OLED_ShowChar(42 + 32 - 3, 5, ':', OLED_6X8);  //
    OLED_ShowNum(42 + 32 + 2, 5, 50, 2, OLED_6X8); // 秒
#endif

    // 装饰线
    OLED_DrawLine(0, 18, 32, 18);   // 画线
    OLED_DrawLine(96, 18, 128, 18); // 画线
    OLED_DrawLine(0, 58, 32, 58);   // 画线
    OLED_DrawLine(96, 58, 128, 58); // 画线

    OLED_DrawLine(32, 18, 42, 24);  // 画线
    OLED_DrawLine(96, 18, 86, 24);  // 画线
    OLED_DrawLine(32, 58, 42, 50);  // 画线
    OLED_DrawLine(96, 58, 86, 50);  // 画线
    OLED_DrawCircle(64, 38, 20, 0); // 圆

    OLED_ShowNum(11, 29, info.m_Set_Water_Value, 2, OLED_8X16); // 设定水量 数据
    // 中间圆形显示内容
    if (info.m_Water_Value != 0)
    {
        if (info.m_Water_Value >= 100)
        {
            OLED_ShowNum(52, 29, info.m_Water_Value, 3, OLED_8X16); // 倒计时数据
        }
        else
        {
            OLED_ShowNum(57, 29, info.m_Water_Value, 2, OLED_8X16); // 倒计时数据
        }
        OLED_ShowChar(62, 46, 'h', OLED_6X8); // 显示秒
    }
    else
    {
        if (info.m_Heat_Tim >= 100)
        {
            OLED_ShowNum(52, 29, info.m_Heat_Tim, 3, OLED_8X16); // 倒计时数据
        }
        else
        {
            OLED_ShowNum(57, 29, info.m_Heat_Tim, 2, OLED_8X16); // 倒计时数据
        }
        OLED_ShowChar(62, 46, 's', OLED_6X8); // 显示秒
    }

    OLED_ShowNum(98, 29, info.m_Set_Heat_Tim, 3, OLED_8X16); // 加热时间数据
                                                             // OLED_ShowChar(10 + 17, 36, '%', OLED_6X8);  // 显示百分号
    // OLED_ShowChar(100 + 17, 36, 's', OLED_6X8);               // 显示秒

    if (info.m_KettleFlag)
    {                                    // 用来指示水壶检测
        OLED_DrawLine(8, 26, 28, 26);    // 画线
        OLED_DrawLine(120, 26, 100, 26); // 画线
    }
}
// 多级菜单调试
void OLED_Menu_Debug(void)
{
    OLED_Init();
    // SetRunDesktop = Chief_Frame_UI;
    SetRunList = MenuVI_Chief; // 运行界面设置成设置界面
    // MenuVII_WaterSet[1].Data = 50; // 设置倒计时数据

    while (1)
    {
        OLED_Menu_Handle();
        KEY_All_event_Handle();
    }
}
// 数据更新
void Ti_Update_Data(void)
{
    MenuVII_Heat[1].Data = info.m_Set_Heat_Tim;    // 水温设定
    MenuVII_Heat[2].Data = info.m_Set_Water_Value; // 设定水量
    MenuVII_Debug[3].Data = info.m_KettleFlag;     // 水壶
    MenuVII_Debug[4].Data = info.m_SpillFlag;      // 水溢
    MenuVII_Debug[5].Data = info.m_Vref_mV;        // 电量
}
/****************************************************************************************/
// 加热点击事件
void MenuVI_Heat_Click_Event(void)
{
    Ti_obj_Set_Stop(&Ti_GET_CO);
    Beep_Sound(1);
}
// 加热退出事件
void MenuVII_Heat_ESC_Event(void)
{
    Ti_obj_Set_Run(&Ti_GET_CO);
    Beep_Sound(1);
}
// 水量设置
void WaterSetValue(void)
{
    if (DataAlterFlag == 0)
    {
        DataAlterFlag = 1;
        StripY_Next = 18; // 弹出
    }
    else if (DataAlterFlag == 1)
    {
        DataAlterFlag = 0;
        StripY_Next = 70;                              // 隐藏
        info.m_Set_Water_Value = MenuVII_Heat[2].Data; // 设定水量
        FLASH_EEPROM_Write(FLASH_WATER_VALUE_ADDR, info.m_Set_Water_Value);
    }
}
// 设定加热时间
void WaterSetHeatTim(void)
{
    if (DataAlterFlag == 0)
    {
        DataAlterFlag = 1;
        StripY_Next = 18; // 弹出
    }
    else if (DataAlterFlag == 1)
    {
        DataAlterFlag = 0;
        StripY_Next = 70;                           // 隐藏
        info.m_Set_Heat_Tim = MenuVII_Heat[1].Data; // 设定水量
        FLASH_EEPROM_Write(FLASH_HEAT_TIM_ADDR, info.m_Set_Heat_Tim);
    }
}
/**********************************************************/
// 设置光标样式
void Setting_menu_Style(void)
{
    if (CurStyle == reverse)
    {
        CurStyle = mouse;
        MenuVII_SetUp[1].Name = "光标风格[鼠标]";
    }
    else if (CurStyle == mouse)
    {
        CurStyle = frame;
        MenuVII_SetUp[1].Name = "光标风格[矩形]";
    }
    else // if(CurStyle == frame)
    {
        CurStyle = reverse;
        MenuVII_SetUp[1].Name = "光标风格[反相]";
    }
}
// 设置动画速度
void Setting_menu_Speed(void)
{
    if (CursorRollSpeed == 8)
    {
        CursorRollSpeed = 16;
        MenuRollSpeed = 1.1;
        MenuVII_SetUp[2].Name = "动画速度[慢]";
    }
    else if (CursorRollSpeed == 16)
    {
        CursorRollSpeed = 1;
        MenuRollSpeed = 16;
        MenuVII_SetUp[2].Name = "动画速度[关]";
    }
    else // if(CursorRollSpeed == 16)
    {
        CursorRollSpeed = 8;
        MenuRollSpeed = 2;
        MenuVII_SetUp[2].Name = "动画速度[快]";
    }
}
// 加热控制
void MenuVII_Debug_Heat_Ctrl(void)
{
    if (strcmp(MenuVII_Debug[1].Name, "加热[关]") == 0)
    {
        mb_write_single_reg(0x01, MB_RW_HEAT_SWITCH, 1);
        MenuVII_Debug[1].Name = "加热[开]";
    }
    else
    {
        mb_write_single_reg(0x01, MB_RW_HEAT_SWITCH, 0);
        MenuVII_Debug[1].Name = "加热[关]";
    }
    Beep_Sound(1);
}
// 阀门控制
void MenuVII_Debug_Valve_Ctrl(void)
{
    if (strcmp(MenuVII_Debug[2].Name, "阀门[关]") == 0)
    {
        mb_write_single_reg(0x01, MB_RW_WATER_VALVE, 1);
        MenuVII_Debug[2].Name = "阀门[开]";
    }
    else
    {
        mb_write_single_reg(0x01, MB_RW_WATER_VALVE, 0);
        MenuVII_Debug[2].Name = "阀门[关]";
    }
    Beep_Sound(1);
}
// 水壶状态
void MenuVII_Kettle_State(void)
{
    // uint16_t KettleState[1] = {0};
    // mb_read_reg(0x01, MB_R_KETTLE_STATE, 1, KettleState);
    // MenuVII_Debug[3].Data = KettleState[0];
    MenuVII_Debug[3].Data = info.m_KettleFlag;
    Beep_Sound(1);
}
// 水溢状态
void MenuVII_Spill_State(void)
{
    uint16_t Spill_State[1] = {0};
    mb_read_reg(0x01, MB_R_SPILL_STATE, 1, Spill_State);
    MenuVII_Debug[4].Data = Spill_State[0];
    Beep_Sound(1);
}
// 电量检测
void MenuVII_Energy(void)
{
    MenuVII_Debug[5].Data = info.m_Vref_mV;
    Beep_Sound(1);
}
